package com.ming.learn.from.carl.binary.tree;

import com.ming.commons.utils.TreeNode;
import com.sun.jmx.remote.internal.ArrayQueue;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Of20210305LeetCode107 {
    /*
    给定一个二叉树，返回其节点值自底向上的层次遍历。（即按从叶子节点所在层到根节点所在的层，逐层从左向右遍历）
     */
    public static void main(String[] args) {
        System.out.println(levelOrderBottom(new TreeNode(1, new TreeNode(2, new TreeNode(4)
                , new TreeNode(5)), new TreeNode(3, new TreeNode(6), new TreeNode(7)))));
    }

    /*
    相对于102.二叉树的层序遍历，就是最后把result数组反转一下就可以了。
     */
    private static List<List<Integer>> levelOrderBottom(TreeNode root) {
        ArrayQueue<TreeNode> que = new ArrayQueue<>(10);
        ArrayList<List<Integer>> result = new ArrayList<>();

        if (root!=null) que.add(root);
        while (!que.isEmpty()){
            int size = que.size();
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                TreeNode node = que.remove(0);
                temp.add(node.val);
                if (node.left!=null) que.add(node.left);
                if (node.right!=null) que.add(node.right);
            }
            result.add(temp);
        }
        Collections.reverse(result);
        return result;
    }
}
